<template>
  <div class="todo-footer">
    <label>
      <!-- v-model 双向数据绑定 -->
      <input type="checkbox" v-model="isAllChecked" />
    </label>
    <span>
      <span>已完成{{ taskDone }}</span> / 全部{{ list.length }}
    </span>
    <button class="btn btn-danger" @click="handlerDone">清除已完成任务</button>
  </div>
</template>

<script>
export default {
  // data() {
  //   return {
  //     allCheck: false
  //   }
  // },
  props: ['list', 'handlerDone', 'changeIpt'],

  // 计算任务的完成状态的数量，建议使用计算属性
  computed: {
    // 根据列表，过滤出已完成任务的数量
    taskDone() {
      // 先把已经完成的任务，返回到一个新数组，在return数组长度
      // const arr = this.list.filter((item) => item.isDone)
      // return arr.length
      // 方式2: 声明count
      // let count = 0
      // this.list.forEach((item) => {
      //   if (item.isDone) {
      //     count++
      //   }
      // })
      // return count

      // 使用reduce的方式 => 返回的值是 初始值加上当前值的和
      // 当前值是对象，根据三元表达式，如果当前项的布尔值为true就给1，如果为false给0
      // 所谓的工作经验，就是对于一个需求的最佳实践
      return this.list.reduce((res, cur) => res + (cur.isDone ? 1 : 0), 0)
    },

    // 通过对比已完成任务的数量 和 任务的总数量进行对比

    /*
      默认计算属性，只有getter的情况才可以简写，如果需要修改，则应该写成对象形式
      setter 形参接收的是修改的那个值，setter不需要return
    */
    isAllChecked: {
      get() {
        // 已完成的任务数量
        // console.log(this.taskDone)
        // 任务的总数量
        // console.log(this.list.length)
        // console.log(this.taskDone === this.list.length && this.taskDone > 0)
        return this.taskDone === this.list.length && this.list.length > 0
      },
      set(val) {
        // 接收的形参，就是复选框选中的布尔值状态
        // console.log(val)

        // 每一次改变复选框按钮的状态，都会触发 setter
        this.changeIpt(val)
      }
    }
  }
  // methods: {
  //   fn() {
  //     // 通过自己的状态修改其他人
  //     this.changeIpt(this.allCheck)
  //   }
  // }
}
</script>

<style lang="less" scoped>
/*footer*/
.todo-footer {
  height: 40px;
  line-height: 40px;
  padding-left: 6px;
  margin-top: 5px;
}

.todo-footer label {
  display: inline-block;
  margin-right: 20px;
  cursor: pointer;
}

.todo-footer label input {
  position: relative;
  top: -1px;
  vertical-align: middle;
  margin-right: 5px;
}

.todo-footer button {
  float: right;
  margin-top: 5px;
}
</style>
